package main

import "fmt"

// 本质上就是类的概念，只是没有 class 包裹
// 在 go 语言中，没有类的概念但是可以给类型(结构体，自定义类型) 定义方法。
// 所谓方法就是定义了接收者的函数。接收者的概念就类似于其他语言中的 this 或者 self。
// 面向对象的概念。。。。

// 定义结构体
type Person struct {
	Name   string
	Age    int
	Sex    string
	Height int
}

// 添加结构体方法
func (p Person) SayHello() {
	fmt.Printf("%#v\n", p)
	fmt.Printf("Name:%v, Age:%d, Sex:%v, Height:%d\n", p.Name, p.Age, p.Sex, p.Height)
}

// set
func (p *Person) SetName(name string) {
	p.Name = name
}

func (p *Person) SetAge(age int) {
	p.Age = age
}

func (p *Person) SetSex(sex string) {
	p.Sex = sex
}

func (p *Person) SetHeight(height int) {
	p.Height = height
}

// get
func (p Person) GetName() string {
	return p.Name
}

func (p Person) GetAge() int {
	return p.Age
}

func (p Person) GetSex() string {
	return p.Sex
}

func (p Person) GetHeight() int {
	return p.Height
}

func main() {
	var struct1 = Person{Name: "Tom", Age: 18, Sex: "男", Height: 170}
	struct1.SayHello()
	// main.Person{Name:"Tom", Age:18, Sex:"男", Height:170}
	// Name:Tom, Age:18, Sex:男, Height:170

	struct1.SetName("Jerry")
	struct1.SetAge(20)
	struct1.SetSex("女")
	struct1.SetHeight(160)
	struct1.SayHello()
	//main.Person{Name:"Jerry", Age:20, Sex:"女", Height:160}
	// Name:Jerry, Age:20, Sex:女, Height:160

	fmt.Println(struct1.GetName())   // Jerry
	fmt.Println(struct1.GetAge())    // 20
	fmt.Println(struct1.GetSex())    // 女
	fmt.Println(struct1.GetHeight()) // 160
}
